package com.qianda.qdminiapp.service.impl;

import ch.qos.logback.classic.gaffer.PropertyUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qianda.qdminiapp.common.constant.CommonConstant;
import com.qianda.qdminiapp.common.exception.ExceptionCode;
import com.qianda.qdminiapp.common.exception.SimpleException;
import com.qianda.qdminiapp.common.future.CommandFutureManager;
import com.qianda.qdminiapp.controller.Result;
import com.qianda.qdminiapp.dao.device.DeviceDao;
import com.qianda.qdminiapp.dao.order.OrderDao;
import com.qianda.qdminiapp.dao.order.QqdOrderLogsDao;
import com.qianda.qdminiapp.dao.order.QqdOrderTowelDao;
import com.qianda.qdminiapp.domain.model.device.Device;
import com.qianda.qdminiapp.domain.model.order.Order;
import com.qianda.qdminiapp.domain.model.order.QqdOrderLogs;
import com.qianda.qdminiapp.domain.model.order.QqdOrderTowel;
import com.qianda.qdminiapp.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName TcpResponseServiceImpl
 * @Author cw
 * @Date 2019/8/8 17:39
 * @Version 1.0
 */
@Service
@Transactional
public class TcpResponseServiceImpl implements TcpResponseService {
    private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private QqdOrderLogsDao qqdOrderLogsDao;

    @Autowired
    private CommandFutureManager commandFutureManager;

    @Autowired
    private DeviceDao deviceDao;

    @Autowired
    private OrderDao orderDao;

    @Autowired
    private ShareBenefitService shareBenefitService;

    @Autowired
    private QqdOrderTowelDao qqdOrderTowelDao;

    @Override
    @Transactional
    public void tcpResponseHandler(String msg) {
        LOGGER.info("------开始--获取tcp协议---start getTcp  controller-----");

        LOGGER.info("获取tcp协议值为：" + msg);
        LOGGER.info("---设备返回命令：-" + msg + "----");
        // 2019/05/16
        QqdOrderLogs qqdOrderLogs = new QqdOrderLogs(msg);
        qqdOrderLogsDao.insert(qqdOrderLogs);


        String[] split = msg.split("\\|");
        String cmd = split[0];
        String orderId = split[1];

        QueryWrapper<QqdOrderTowel> qqdOrderTowelQueryWrapper = new QueryWrapper<>();
        qqdOrderTowelQueryWrapper.eq("orderNo",orderId);
        QqdOrderTowel order = qqdOrderTowelDao.selectOne(qqdOrderTowelQueryWrapper);

        if(order ==null){
            throw new SimpleException(ExceptionCode.EX_HTTP_INPUT_NOT_ENTATY);
        }

        Device device = deviceDao.selectById(order.getOrderDeviceId());

        switch (cmd) {
            case "0D01":
                LOGGER.info("---------服务器收到出巾成功命令" + cmd + "，订单号为：" + orderId);
               // qqdOrderLogsDao.insert(new QqdOrderLogs(msg));
               // commandFutureManager.setResult(device.getDeviceCcid(),"0D01");
                order.setOrderStatus(CommonConstant.OrderOutTowelStatus.ORDER_OUT_TOWEL_STATUS_FINISH);
                order.setUpdateTime(LocalDateTime.now());
                qqdOrderTowelDao.updateById(order);

                //库存减一

                //进行分润
                //shareBenefitService.sharBenefitStart(order.getOrderId());

                break;
            case "0E00":// 报错
                LOGGER.info("----进入0E00，并添加数据库----");
                order.setOrderStatus(CommonConstant.OrderOutTowelStatus.ORDER_OUT_TOWEL_STATUS_ERROR);

                //走退款流程
                Integer payType = 0;
                Integer orderTypeDictId = order.getOrderPayType();
                if(orderTypeDictId == 1){
                    payType = CommonConstant.PayType.PAY_TYPE_WX;
                }else if(orderTypeDictId == 28){
                    payType = CommonConstant.PayType.PAY_TYPE_QQD;
                }else if(orderTypeDictId == 42){
                    payType = CommonConstant.PayType.PAY_TYPE_BALANCE;
                }
                //选择相应的退款策略
                OrderAndPaymentStrategy orderAndPaymentStrategy = PaymentSelector.getPaymentSelector(payType);
                orderAndPaymentStrategy.refundPay(order);
                order.setOrderStatus(CommonConstant.OrderStatus.ORDER_STATUS_REFUND);
                qqdOrderTowelDao.updateById(order);

                //  String insertOrderLogs = insertOrderLogs(str, remoteAddr);
             //   LOGGER.info("---添加0E00命令记录：-" + insertOrderLogs + "----");
                String errNum = split[2];// 错误命令码
               // commandFutureManager.setResult(device.getDeviceCcid(),"errNum");

                // 2019/05/04 21:44
                // 2019/05/16
                // 查询该笔订单发送了几次出巾命令
//                Integer cmdCount = orderService.selectOrderLogs(orderId, "0D00");
//                // 判断如果命令发送次数小于指定次数，就退出
//                String count = PropertyUtil.getProperty("0D00");
//                if (errNum.equals("01.")) {
//                    LOGGER.info("----错误号：" + errNum + "缺水----");
//                } else if (split[2].equals("02.")) {
//                    LOGGER.info("----错误号：" + errNum + "缺巾----");
//                } else if (errNum.equals("03.")) {
//                    LOGGER.info("----错误号：" + errNum + "卷巾出卡巾----");
//                } else if (errNum.equals("04.")) {
//                    LOGGER.info("--错误号：" + errNum + "切巾电机异常-----");
//                } else if (errNum.equals("05.")) {
//                    LOGGER.info("--错误号：" + errNum + "切巾出卡巾-----");
//                } else if (errNum.equals("06.")) {
//                    LOGGER.info("----错误号：" + errNum + "IC卡模块错误----");
//                } else if (errNum.equals("07.")) {
//                    LOGGER.info("----错误号：" + errNum + "卷巾余额不足----");
//                } else if (errNum.equals("08.")) {
//                    LOGGER.info("-----主板未反馈08.------");
//                    // 2019/05/05 11:30
//                    // Thread.sleep(1500);
//                    if (cmdCount < Integer.valueOf(count)) {
//                        return errorAfterTo0D00(orderId);
//                    }
//                } else {
//                    LOGGER.info("---此错误尚未分类");
//                }
//                LOGGER.info("--服务器收到出巾失败命令：" + cmd + "，订单号为：" + orderId);
//                // 根据订单id查询订单类型，订单金额
//                PageData pd = new PageData();
//                pd.put("orderId", orderId);
//                // data包含订单类型id和订单金额
//                PageData data = orderService.findRefundMoneyAndType(pd);
//                LOGGER.info("--失败订单信息为：" + data);
//                if (data == null) {
//                    LOGGER.info("订单错误----------");
//                    return ServerResponse.createByError();
//                }
//                String orderBody = data.getString("ORDER_BODY");
//                if ("sendTest".equals(orderBody) || "existiOrderSendTest".equals(orderBody)) {
//                    LOGGER.info("该笔订单为设备测试订单或被标记，不进行分润退款");
//                    return ServerResponse.createByError();
//                }
//                if (data.get("ORDER_TYPE_DICT_ID").toString().equals("1")) {
//                    int totalMoney = (int) (Double.parseDouble(data.get("ORDER_MONEY").toString()) * 100);
//                    LOGGER.info("此订单类型为微信支付，金额为：" + totalMoney + "分，" + "进行退款处理-------");
//                    // 微信退款
//                    pd.put("orderMoney", totalMoney);
//                    Map<?, ?> refund = new RefundUtil().WxRefund(pd);
//                    // 退款后发送模块信息
//                    String openid = orderService.findOpenIdByUserId("5");
//                    if (openid == null) {
//                        LOGGER.info("此用户未关注公众号-------");
//                    }
//                    // 56毛巾机设置失败(返回null)
//                    // 57毛巾机设置失败(返回未成功)
//                    // 58毛巾机反馈缺巾
//                    // 59毛巾机主板未反馈
//                    // 60毛巾机卡巾
//                    String refundType = null;
//                    if (errNum.equals("08.")) {
//                        refundType = "59";
//                    } else if (errNum.equals("05.")) {
//                        refundType = "60";
//                    } else if (errNum.equals("02.")) {
//                        refundType = "58";
//                    } else if (errNum.equals("03.")) {
//                        refundType = "62";
//                    } else {
//                        refundType = "61";
//                    }
//                    // 2019/05/15
//                    PageData pd1 = new PageData();
//                    pd1.put("orderId", orderId);
//                    pd1.put("refundType", refundType);
//                    this.dao.save("orderMapper.addRefundInfoByOrderId", pd1);
//                    // orderService.gzhRefund(split[1], openid, refundType);
//                    String sendPost = null;
//                    String url = PropertyUtil.getProperty("sendInfoUrl");
//                    try {
//                        sendPost = HttpRequest.sendPost(url, "orderid=" + orderId);
//                        LOGGER.info("--发送推送请求返回值" + sendPost + "---");
//                    } catch (Exception e) {
//                        LOGGER.error("--发送推送请求返回值异常" + sendPost + "---");
//                    }
//                    TimeUnit.SECONDS.sleep(5);// 退款后间隔五秒进行服务商退款
//                    // 扣除服务商和代理商余额
//                    LOGGER.info("扣除服务商余额--------");
//                    // 修改订单状态为55，已退款
//                    int i = orderService.setAgentMoney(orderId);
//                    if (i > 0) {
//                        LOGGER.info("扣除服务商余额成功，扣除了" + i + "位服务商余额-----");
//                    } else {
//                        LOGGER.info("扣除服务商余额失败，受影响条数为0------");
//                    }
//
//                } else if (data.get("ORDER_TYPE_DICT_ID").toString().equals("42")) {
//                    LOGGER.info("此订单为余额支付，金额为：" + data.get("ORDER_MONEY"));
//                    // 返还消费者余额
//                    LOGGER.info("返还消费者余额");
//                    Integer i1 = orderService.setUserMoney(orderId);
//                    if (i1 > 0) {
//                        LOGGER.info("余额退款成功");
//                    }
//                    TimeUnit.SECONDS.sleep(5);// 退款后间隔三秒进行服务商退款
//                    // 扣除服务商和代理商余额
//                    LOGGER.info("-----扣除代理商余额----");
//                    int i2 = orderService.setAgentMoney(orderId);
//                    if (i2 > 0) {
//                        LOGGER.info("------扣除服务商余额成功，扣除了" + i2 + "位服务商余额");
//                    } else {
//                        LOGGER.info("------服务商退款失败");
//                    }
//                } else {
//                    LOGGER.info("-----此订单为千千豆支付-----");
//                    // 返还消费者余额
//                    LOGGER.info("----返还消费者千千豆----");
//                    orderService.setUserQqb(orderId);
//                }
//                // System.out.println("出巾失败，库存+1");
//                orderService.inventoryPlus(orderId);
                break;
            default:
                break;
        }
        LOGGER.info("------结束--获取tcp协议-----------end getTcp  controller-----");

    }
}
